package servidor.controle;

import java.sql.SQLException;
import java.util.ArrayList;

import servidor.modelo.Gerente;

public class GerenteControlador {
	public static void cria(String nome, String login, String senha)
			throws SQLException {
		Sistema sistema = Sistema.getUnicaInstancia();
		Gerente gerente = sistema.getEntityManager().create(Gerente.class);
		UsuarioControlador.atualiza(gerente, nome, login, senha); // Assim como
		// um
		// cliente,
		// informações
		// de login
		// para
		// usuarios
		// são
		// necessárias
		gerente.save();
		System.out.println("gerente criado");
	}

	public static void atualiza(int id, String nome, String login, String senha) {
		Gerente gerente = get(id);

		UsuarioControlador.atualiza(gerente, nome, login, senha); // Assim como
		// um
		// gerente,
		// informações
		// de login
		// para
		// usuarios
		// são
		// necessárias
		gerente.save();
	}

	public static Gerente get(int id) {
		Sistema sistema = Sistema.getUnicaInstancia();
		return sistema.getEntityManager().get(Gerente.class, id);
	}

	public static Gerente get(String login, String senha) {
		Sistema sistema = Sistema.getUnicaInstancia();
		Gerente[] gerentes;
		try {
			gerentes = sistema.getEntityManager().find(Gerente.class,
					"login = ? and senha = ?", login, senha);
		} catch (SQLException e) {
			gerentes = new Gerente[0];
			e.printStackTrace();
		}
		if (gerentes.length == 0) {
			return null;
		}
		return gerentes[0];
	}

	public static String exists(String login) {
		Sistema sistema = Sistema.getUnicaInstancia();
		Gerente[] gerentes;
		try {
			gerentes = sistema.getEntityManager().find(Gerente.class,
					"login = ?", login);
		} catch (SQLException e) {
			gerentes = new Gerente[0];
			e.printStackTrace();
		}
		if (gerentes.length == 0) { // não existe
			return "false";
		}
		return "true";
	}

	public static ArrayList<Gerente> getAll() throws SQLException {
		Sistema sistema = Sistema.getUnicaInstancia();
		Gerente[] gerentesArray = sistema.getEntityManager()
				.find(Gerente.class);
		ArrayList<Gerente> gerentes = new ArrayList<Gerente>();
		sistema.fromArrayToArrayList(gerentesArray, gerentes);
		return gerentes;
	}

	public static void delete(Gerente gerente) throws SQLException {
		Sistema sistema = Sistema.getUnicaInstancia();
		sistema.getEntityManager().delete(gerente);
	}

	public static void delete(int id) throws SQLException {
		delete(get(id));
	}

	private static void addToBuilder(StringBuilder sb, String s) {
		sb.append(String.format("%s\n", s)); // adiciona um valor a cada linha
	}

	private static void addToBuilder(StringBuilder sb, int i) {
		sb.append(String.format("%d\n", i)); // adiciona um valor a cada linha
	}

	private static void addToBuilderSemPular(StringBuilder sb, String s) {
		sb.append(String.format("%s", s)); // adiciona um valor a cada linha
	}

	private static void addToBuilderSemPular(StringBuilder sb, int i) {
		sb.append(String.format("%d", i)); // adiciona um valor a cada linha
	}

	// Retorna na ordem: id, nome, login, senha
	public static String parseString(Gerente gerente) {
		if (gerente == null)
			return "null";
		// StringBuilder tem a vantagem de não ficar alocando espaço para uma
		// string a cada mudança de valor
		StringBuilder sb = new StringBuilder();
		addToBuilder(sb, gerente.getID());
		addToBuilder(sb, gerente.getNome());
		addToBuilder(sb, gerente.getLogin());
		addToBuilderSemPular(sb, gerente.getSenha());
		return sb.toString();
	}

	// Retorna de todos os gerentes passados na ordem: id, nome, login, senha.
	// E depois termina passando a string END
	public static String parseString(ArrayList<Gerente> gerentes) {
		if (gerentes == null)
			return "null";
		// StringBuilder tem a vantagem de não ficar alocando espaço para uma
		// string a cada mudança de valor
		StringBuilder sb = new StringBuilder();
		for (Gerente gerente : gerentes) {
			addToBuilder(sb, parseString(gerente));
		}
		addToBuilderSemPular(sb, "END");
		return sb.toString();
	}
}
